// 非常简洁 ，三次DFS 即可解决
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 10; // 定义最大节点数

vector<int> g[N];               // 邻接表存储树结构
int depth[N], depA[N], depB[N]; // 三个深度数组，分别存储从不同起点开始的深度
int mx1 = -1, A = -1;           // 全局变量，存储最大深度和对应的根节点

// 深度优先搜索函数，计算从根节点到所有节点的深度
void dfs(int u, int fa, int dep[]) {
  dep[u] = dep[fa] + 1; // 当前节点的深度等于父节点深度加1
  for (auto v : g[u])   // 遍历当前节点的所有邻居
    if (v != fa) {      // 避免回到父节点
      dfs(v, u, dep);   // 递归搜索子节点
    }
}

int main() {
  int n;
  cin >> n; // 输入节点数量

  // 构建树的邻接表
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;     // 输入边
    g[u].push_back(v); // 无向图，双向添加边
    g[v].push_back(u);
  }

  // 第一次DFS：从节点1开始，计算所有节点的深度
  dfs(1, 1, depth);

  // 找出距离节点1最远的节点，这个节点一定是树直径的一个端点
  int mx1 = -1, A = -1;
  for (int i = n; i >= 1; i--) {
    if (depth[i] > mx1) {
      mx1 = depth[i]; // 更新最大深度
      A = i;          // 记录对应的节点
    }
  }

  // 第二次DFS：从直径的第一个端点A开始，计算所有节点的到A的深度
  dfs(A, A, depA);

  // 找出距离rt1最远的节点，这个节点就是直径的另一个端点
  int mx2 = -1, B = -1;
  for (int i = n; i >= 1; i--) {
    if (depA[i] > mx2) {
      mx2 = depA[i]; // 更新最大深度
      B = i;         // 记录直径的第二个端点
    }
  }

  // 第三次DFS：从直径的第二个端点B开始，计算所有节点的到B的深度
  dfs(B, B, depB);

  // 对于每个节点，判断它离哪个端点更近
  for (int i = 1; i <= n; i++) {
    if (depA[i] > depB[i])       // 如果离A更近
      cout << A << endl;         // 输出A
    else if (depB[i] > depA[i])  // 如果离B更近
      cout << B << endl;         // 输出B
    else                         // 如果距离相等
      cout << max(A, B) << endl; // 输出编号较大的端点
  }
}